/*
 * Конструктор контрола комментариев, это элемент управляющий показом и скрытием комментариев.
 * Фактически в нужный момент передает управление экземпляру CommentsContainer'а
 *
 * @author Alexander Sibiryakov
 */
function CommentsControl(item_oid) {
	this.item_oid = item_oid;
	this.item_id = "#i"+item_oid;
	this.ccontainer = null;
	this._view = new CommentsControlView(item_oid);

	var ccount = this._view.getCommentsCount();
	var can_comment = this._view.isUserCanComment(); // не выводить кнопку "Добавить" для комментария, если у аккаунта прав нет

	/*
	 * Установить кол-во комментариев у контрола
	 */
	this.setCommentsCount = function(cc) {
		ccount = cc;
	}

	/*
	 * Получить кол-во комментариев
	 */
	this.getCommentsCount = function() {
		return ccount;
	}

	/*
	 * Увеличить на cc кол-во комментариев, по умолчанию на 1
	 */
	this.incCommentsCount = function(cc) {
		if (cc) ccount = ccount + cc; else ccount++;
	}

	/*
	 * Уменьшить на cc кол-во комментариев, по умолчанию на 1
	 */
	this.decCommentsCount = function(cc) {
		if (cc) ccount = ccount - cc; else ccount--;
	}

	/*
	 * Обновить интерфейс контрола. Сгенерирует, выведет в дом и повесит обработчики
	 */
	this.update = function() {
		var content = this.renderInterfaceString();
		this._view.toDom(content);
		this._bindInterfaceElements();
	}

	/*
	 * Вешает обработчики на кнопку "показать комментарии" и "добавить комментарий"
	 */
	this._bindInterfaceElements = function() {
		jQuery(this._view.getCommentsBtn()).bind("click", this, function(event) {
			event.preventDefault();
			var _this = event.data;
			_this.comments_callback();
		});

		jQuery(this._view.getSubmitBtn()).bind("click", this, function(event) {
			event.preventDefault();
			var _this = event.data;
			_this.submitform_callback();
		});
	}

	this.comments_callback = function() {

		if (this.is_hidden_comments) {
			// если комменты вдруг скрыты
			this.showComments();
			this.is_hidden_submitform = false;
			this.is_hidden_comments = false;

		} else {
			// если комменты открыты
			// то как мы тут оказались?
			window.console.log("abnormal behaviour");
		}

		this.update();
	}

	this.submitform_callback = function() {
		if (this.is_hidden_submitform) {
			// если форма сабмита скрыта то покажем ее
			this.showSubmitForm();
			this.is_hidden_submitform = false;
		} else {
			// если форма сабмита открыта
			// скроем комменты если они открыты и скроем форму сабмита
			if (!this.is_hidden_comments) {
				this.hideComments();
				this.is_hidden_comments = true;
			}

			this.hideSubmitForm();
			this.is_hidden_submitform = true;
		}
		this.update();
	}

	// базируясь на этих состояниях функция this.renderInterfaceString будет рендерить интерфейс контрола
	this.is_hidden_submitform = true;
	this.is_hidden_comments = true;
	// тут же наличие/отсутствие комментариев
	// ну и конечно смотря какую кнопку нажмут

	// выводит форму сабмита
	this.showSubmitForm = function(use_tmp_cont) {
		this._view.selOn();
		if (this.ccontainer == null) this.ccontainer = new CommentsContainer(this);

		jQuery(this._view.getSelf()).one("ContainerLoaded", this.ccontainer, function(event) {
			var _this = event.data;
			_this.showSubmitForm(true);
		});
		this.ccontainer.lookupContainer("ContainerLoaded");
	}

	// выводит коментарии
	this.showComments = function() {
		this._view.selOn();

		if (this.ccontainer == null) this.ccontainer = new CommentsContainer(this);

		jQuery(this._view.getSelf()).one("ContainerLoaded", this.ccontainer, function(event) {
			var _this = event.data;
			_this.showComments();
		});

		jQuery(this._view.getSelf()).one("ContainerLoaded", this.ccontainer, function(event) {
			var _this = event.data;
			_this.showSubmitForm(false);
		});
		this.ccontainer.lookupContainer("ContainerLoaded");

	}

	// скрывает форму сабмита
	this.hideSubmitForm = function() {
		this._view.selOff();
		this.ccontainer.hideSubmitForm();
	}

	// скрывает комментарии
	this.hideComments = function() {
		this._view.selOff();
		this.ccontainer.hideComments();
	}

	/*
	 * Генерирует код интерфейса в зависимости от параметров:
	 *  - кол-во комментариев
	 *  - есть ли доступ на комментирование
	 *  - скрыта ли сейчас форма сабмита
	 *  - скрыты ли сами комментарии
	 *
	 */
	this.renderInterfaceString = function() {
		var is_comments = this.getCommentsCount() > 0 ? true : false;

		var content;

		if (this.is_hidden_comments && is_comments && this.is_hidden_submitform) {
			return this._view.renderHidCommentsHidForm(ccount, can_comment);
		}

		if (!this.is_hidden_comments && is_comments) {
			return this._view.renderOpenComments(ccount);
		}

		if (this.is_hidden_submitform && !is_comments) {
			return this._view.renderHidFormNoComments(can_comment);
		}

		if (!this.is_hidden_submitform && !is_comments) {
			return this._view.renderOpenFormNoComm();
		}

		if (!this.is_hidden_submitform && is_comments && this.is_hidden_comments) {
			return this._view.renderOpenFormHidComm(ccount);
		}

	}

	this._bindInterfaceElements();
}
